#define _CRT_SECURE_NO_WARNINGS 1

//#include <stdio.h>
//#include <string.h>

// strtok函数的使用
// char* strtok(char* str, const char* sep);

// sep参数指向一个字符串，定义了用作分隔符的字符集合
// 第一个参数指定一个字符串，它包含了0个或多个由sep字符串中一个或者多个分隔符分割的标记
// strtok函数找到str中的下一个标记，并将其用\0结尾，返回一个指向该标记的指针
// strtok函数的第一个参数不为NULL，函数将找到str中第一个标记，strtok函数将保存它在字符串中的位置
// strtok函数的第一个参数为NULL，函数将在同一个字符串中被保存的位置开始，查找下一个标记
// 如果字符串中不存在更多的标记，则返回NULL指针

//int main()
//{
//	char arr1[] = "ZhangSan@163.com";
//	char arr2[30] = { 0 };
//
//	strcpy(arr2, arr1);
//
//	const char* p = "@.";
//	char* s = NULL;
//
//	for (s = strtok(arr2, p); s != NULL; s = strtok(NULL, p))
//	{
//		printf("%s\n", s);
//	}
//
//	//char* s = strtok(arr2, p);
//	//printf("%s\n", s);
//
//	//s = strtok(NULL, p);
//	//printf("%s\n", s);
//
//	//s = strtok(NULL, p);
//	//printf("%s\n", s);
//
//	return 0;
//}

// strerror函数的使用
// 当我们在使用标准库中的函数的时候发生了某种错误， 就会将对应的错误码，存放在errno中

//#include <errno.h>
//#include <stdio.h>
//#include <string.h>

//int main()
//{
//	for (int i = 0; i < 10; i++) {
//		printf("%d : %s\n", i, strerror(i));
//	}
//
//
//	return 0;
//}

//int main()
//{
//    FILE* pFile;
//    pFile = fopen("unexist.ent", "r");
//    if (pFile == NULL)
//        printf("Error opening file unexist.ent: %s\n", strerror(errno));
//    else
//        printf("打开文件成功\n");
//
//    return 0;
//}

// perror函数
//#include <stdio.h>
//#include <string.h>
//#include <errno.h>
//int main()
//{
//    FILE* pfile;
//    pfile = fopen("unexist.ent", "r");
//    if (pfile == NULL)
//        //printf("error opening file unexist.ent: %s\n", strerror(errno));
//        perror("error opening file unexist.ent");
//    return 0;
//}

// C语言内存函数
// memcpy的使用和模拟实现
// 函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置
// 这个函数在遇到'\0'的时候并不会停下来
// 如果source和destination有任何的重叠，复制的结果都是未定义的
// void * memcpy ( void * destination, const void * source, size_t num );

//#include <stdio.h>
//#include <string.h>
//
//int main()
//{
//	//int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	//int arr2[10] = { 0 };
//
//	char arr1[10] = "Hello";
//	char arr2[10] = { 0 };
//
//	// 将arr1中的1 2 3 4 5拷贝到arr2中
//	memcpy(arr2, arr1, 5);
//
//	for (int i = 0; i < 5; i++) {
//		printf("%c ", arr2[i]);
//	}
//
//	return 0;
//}

//#include <stdio.h>
//#include <string.h>
//
//void* my_memcpy(void* dest, const void* src, size_t num)
//{
//	void* ret = dest;
//	while (num--)
//	{
//		*(char*)dest = *(char*)src; // 临时强制转换
//		dest = (char*)dest + 1;
//		src = (char*)src + 1;
//	}
//
//	return ret;
//}
//
//int main()
//{
//	int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	int arr2[10] = { 0 };
//
//	my_memcpy(arr2, arr1 + 3, 5 * sizeof(int));
//	for (int i = 0; i < 10; i++) {
//		printf("%d ", arr2[i]);
//	}
//
//	return 0;
//}

//#include <stdio.h>
//#include <string.h>
//
//void* my_memmove(void* dest, const void* src, size_t num)
//{
//	assert(dest && src);
//	void* ret = dest;
//
//	if (dest < src)
//	{
//		// 从前向后
//		while (num--) {
//			*(char*)dest = *(char*)src; // 临时强制转换
//			dest = (char*)dest + 1;
//			src = (char*)src + 1;
//		}
//	}
//	else 
//	{
//		// 从后向前
//		dest = (char*)dest + num - 1;
//		src = (char*)src + num - 1;
//
//		while (num--) {
//			*(char*)dest = *(char*)src; // 临时强制转换
//			dest = (char*)dest - 1;
//			src = (char*)src - 1;
//		}
//	}
//
//	return ret;
//}
//
//// 1 2 3 4 3 4 5 6 7 10 
//int main()
//{
//	int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	int arr2[10] = { 0 };
//
//	my_memmove(arr1 + 4, arr1 + 2, 5 * sizeof(int));
//	for (int i = 0; i < 10; i++) {
//		printf("%d ", arr1[i]);
//	}
//
//	return 0;
//}

// C语言中规定：
// memcpy拷贝的就是不重叠的内存
// memmove拷贝的是重叠的内存


// memset的使用
// memset内存设置
// void * memset ( void * ptr, int value, size_t num );

#include <stdio.h>
#include <string.h>

//int main()
//{
//	char arr[10] = "hello bit";
//	memset(arr, 'x', 5);
//	// memset在设置的时候，是以字节为单位
//	printf("%s\n", arr);
//
//
//	return 0;
//}

//int main()
//{
//	int arr[10] = { 0 };
//	memset(arr, 1, 40); // error
//
//	return 0;
//}

// memcmp的使用
// 比较从ptr1和ptr2指针指向的位置开始，向后的num字节
// int memcmp ( const void * ptr1, const void * ptr2, size_t num );
//int main()
//{
//	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
//	int arr2[] = { 1,2,3,4,8 };
//
//	int ret = memcmp(arr1, arr2, 16);
//
//	printf("%d\n", ret);
//
//	return 0;
//}